home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Internet / News / Alexandra.0.82 / Source / AMGErrorHandling.subproj / EMErrorAction+Dispatch.m < prev    next >
Encoding:
Text File  |  1996-01-30  |  4.2 KB  |  162 lines

  1.  
  2. #import "EMErrorAction+Dispatch.h"
  3. #import "EMErrorInfo.h"
  4. #import "EMErrorManager.h"
  5. #import "localizable_strings.h"
  6. #import <syslog.h>
  7. #import <appkit/appkit.h>
  8.  
  9. //--------------------------------------------------------------------------------
  10. //    MANCHE APPLICATIONEN SIND AUSKUNFTSFREUDIGER...
  11. //--------------------------------------------------------------------------------
  12.  
  13. @protocol EMCleverApplication
  14.  
  15. - (const char *)appVersion;
  16. - (const char *)appName;
  17.  
  18. @end
  19.  
  20.  
  21. //--------------------------------------------------------------------------------
  22. // HILFSFUNKTIONEN. 
  23. //--------------------------------------------------------------------------------
  24.  
  25. @implementation EMErrorAction(Dispatch)
  26.  
  27. static BOOL isvar(char **p,const char *var)
  28.     {
  29.     size_t    l=strlen(var);
  30.     BOOL    match;
  31.     
  32.     match=!strncmp(*p,var,l);
  33.     if(match)
  34.         (*p)+=l;
  35.     return match;
  36.     }
  37.     
  38.  
  39. //--------------------------------------------------------------------------------
  40. // ARCHIVIERUNG
  41. //--------------------------------------------------------------------------------
  42.  
  43. - awake
  44.     {
  45.     support3=NULL;
  46.     return self;
  47.     }
  48.  
  49.  
  50. //--------------------------------------------------------------------------------
  51. // DISPATCH ERROR
  52. // Bei Aenderungen auch errlexer.lm im Compiler mit aendern!!!!
  53. //--------------------------------------------------------------------------------
  54.  
  55. - (void)dispatch:(EMErrorInfo *)infoObj;
  56.     {
  57.     NXStream    *stream;
  58.     FILE        *mail;
  59.     const char     *p;
  60.     char        cmd[MAXPATHLEN+1],hostname[MAXHOSTNAMELEN+1];
  61.     int            maxlen,len;
  62.     
  63.     stream=NXOpenMemory(NULL,0,NX_WRITEONLY);
  64.     for(p=msgTemplate;*p;)
  65.         if(*p!='$')
  66.             NXPutc(stream,*p++);
  67.         else 
  68.             {
  69.             p++;
  70.             if(isvar(&p,"CODE"))
  71.                 NXPrintf(stream,"%s",[infoObj codeString]);
  72.             else if(isvar(&p,"MESSAGE"))
  73.                 NXPrintf(stream,[infoObj message]);
  74.             else if(isvar(&p,"TIMESTAMP"))
  75.                 NXPrintf(stream,[infoObj timeStamp]);
  76.             else if(isvar(&p,"TIME"))
  77.                 NXPrintf(stream,"%10d",[infoObj time]);
  78.             else if(isvar(&p,"STACKFRAME"))
  79.                 NXPrintf(stream,[infoObj stack]);
  80.             else if(isvar(&p,"STACK"))
  81.                 NXPrintf(stream,[infoObj stack]);
  82.             else if(isvar(&p,"SOURCE"))
  83.                 NXPrintf(stream,[infoObj location]);
  84.             else if(isvar(&p,"PID"))
  85.                 NXPrintf(stream,"%6d",(int)getpid());
  86.             else if(isvar(&p,"USER"))
  87.                 NXPrintf(stream,NXUserName());
  88.             else if(isvar(&p,"HOST"))
  89.                 {
  90.                 if(!gethostname(hostname,MAXHOSTNAMELEN))
  91.                     NXPrintf(stream,hostname);
  92.                 else
  93.                     NXPrintf(stream,"<<cannot determine hostname>>");
  94.                 }
  95.             else if(isvar(&p,"APPNAME"))
  96.                 {
  97.                 if([NXApp respondsTo:@selector(appName)])
  98.                     NXPrintf(stream,[NXApp appName]);
  99.                 else
  100.                     NXPrintf(stream,"<<cannot determine name of application>>");
  101.                 }
  102.             else if(isvar(&p,"APPVERSION"))
  103.                 {
  104.                 if([NXApp respondsTo:@selector(appVersion)])
  105.                     NXPrintf(stream,[NXApp appVersion]);
  106.                 else
  107.                     NXPrintf(stream,"<<cannot determine version of application>>");
  108.                 }
  109.             else if(isvar(&p,"ARCHITECTURE"))
  110.                 NXPrintf(stream,__ARCHITECTURE__);
  111.             else if(isvar(&p,"COMPILER"))
  112.                 NXPrintf(stream,"%s (%d)",__VERSION__,NX_CURRENT_COMPILER_RELEASE);
  113.             else if(isvar(&p,"$"))
  114.                 NXPrintf(stream,"$");
  115.             else
  116.                 NXPrintf(stream,"<<unknown variable>>");
  117.             }
  118.     NXGetMemoryBuffer(stream,&p,&len,&maxlen);
  119.     EM_DURING
  120.         switch(type)
  121.             {
  122.         case EMActionAlert:
  123.             NXRunAlertPanel([self title],p,[self button],NULL,NULL);
  124.             break;
  125.         case EMActionMail:
  126.             if([infoObj code]==EM_INTBASE+23)
  127.                 break;
  128.             if([self respondsTo:@selector(sendMailTo:subject:body:)])
  129.                [(id)self sendMailTo:[self recipient] subject:[self subject] body:p];
  130.             else if(NXRunAlertPanel(NULL,WILL_SEND_MAIL,SEND_BUTTON,CANCEL_BUTTON,
  131.                     NULL,(void *)strlen(p),[self recipient])==NX_ALERTDEFAULT)
  132.                 {
  133.                 sprintf(cmd,"/usr/ucb/Mail -s \"%s\" %s\n",
  134.                     [self subject],[self recipient]);
  135.                 mail=popen(cmd,"w");
  136.                 EM_CONDERROR(mail==NULL,EM_INTBASE+23,[self recipient],NULL);
  137.                 fprintf(mail,p);
  138.                 fprintf(mail,"\n\n.\n");
  139.                 pclose(mail);
  140.                 }
  141.             break;
  142.         default:
  143.             if([infoObj code]==EM_INTBASE+21)
  144.                 break;
  145.             EM_ERROR(EM_INTBASE+21,(void *)type,NULL);
  146.             break;
  147.             }
  148.     EM_HANDLER
  149.         NXCloseMemory(stream,NX_FREEBUFFER);
  150.     EM_ENDHANDLER
  151.     }
  152.     
  153.  
  154. //--------------------------------------------------------------------------------
  155. // THAT'S IT
  156. //--------------------------------------------------------------------------------
  157.  
  158. @end
  159.  
  160.  
  161.  
  162.